package com.menqui.localizame.Gps;

import java.net.URI;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.location.Location;
import android.util.Log;

import com.menqui.localizame.estructuras.DatosRuta;

public class GpsWebService {
	private static String RUTA = "http://empty-lightning-7176.herokuapp.com/ws/addTracks?";

	private String LOG_TAG = getClass().toString();
	private DefaultHttpClient httpClient = null;
	private String responseString = "";
	private List<Location> listaLocations = null;

	private Location ultimaPosicion = null;

	public GpsWebService() {
		httpClient = new DefaultHttpClient();
		listaLocations = new ArrayList<Location>();
	}

	public void setLocation(Location location, DatosRuta datos) {
		listaLocations.add(location);
		ultimaPosicion = location;

		if (listaLocations.size() > 5) {
			procesarVector(datos);
		}
	}

	private void procesarVector(DatosRuta datos) {
		String url = generarRuta(datos);
		List<Location> locationsEnviados = new ArrayList<Location>();

		 for(Location iterLocation: listaLocations) {
				url += anadirLongitudLatitud(iterLocation);
				locationsEnviados.add(iterLocation);
		 }

		 if (enviarDatosWS(url)) {
			 listaLocations.removeAll(locationsEnviados);
		 }

	}

	public String anadirLongitudLatitud(Location iterLocation) {
		return ";" + iterLocation.getLongitude() + ";" + iterLocation.getLatitude();
	}

	private boolean enviarDatosWS(String url) {
		HttpGet request = new HttpGet();
		try {
			request.setURI(new URI(url));
			HttpResponse response = httpClient.execute(request);
			responseString = EntityUtils.toString(response.getEntity());
			httpClient.getConnectionManager().shutdown();
			return true;
		} catch (Exception e) {
			Log.e(LOG_TAG, "Error Comunicacion ", e);
		}
		return false;
	}
	private String generarRuta(DatosRuta datosRuta) {
		return RUTA + "datos=" + datosRuta.getUsuario() + ";"
				+ datosRuta.getIdRuta()	+ ";"
				+ URLEncoder.encode(datosRuta.getNombreRuta()) + ";"
				+ datosRuta.getIdTramo() + ";"
				+ datosRuta.getFechaInicio().getTime() + ";";
	}
	public String getResponseString() {
		return responseString;
	}

	public DatosRuta startRuta(Location location, DatosRuta datosRuta) {
		String cadena = generarRuta(datosRuta);
		cadena += anadirLongitudLatitud(location);
		if (enviarDatosWS(cadena)) {
			String response = getResponseString();
			String[] identificadores = response.split(";");
			datosRuta.setIdRuta(Long.parseLong(identificadores[0]));
			datosRuta.setIdTramo(Long.parseLong(identificadores[1]));
			ultimaPosicion = location;
		}
		return datosRuta;
	}

	public String addComentario(String idRuta, String comentario) {
		String url = RUTA + "datos=" + idRuta + ";" + ultimaPosicion.getTime() + ";" +
				ultimaPosicion.getLongitude() + ";" + ultimaPosicion.getLatitude() + URLEncoder.encode(comentario);

		enviarDatosWS(url);
		return null;
	}

}
